import cv2
import numpy as np

img = cv2.imread("../images/morph.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_canny = cv2.Canny(img_gray, 30, 70)

# 霍夫圆变换
circles = cv2.HoughCircles(
    img_canny,
    cv2.HOUGH_GRADIENT,   # 检测方法,霍夫梯度下降法（用来减少计算量）
    1,    # 累加器分辨率与源图像分辨率的之比（1表示相同分辨率）
    100,  # 检测到的圆心间最小距离（小于这个距离被认为同一个圆）
    param1=70,   # canny边缘检测的高阈值（低阈值为其一半）
    param2=30,   # 累加器阈值 （值越大，表示在霍夫空间中相交的线越多，检测的圆越可靠）
    minRadius=10,  # 最小半径
    maxRadius=100   # 最大半径
)
print(circles)

hough_img = np.zeros_like(img, dtype=np.uint8)
if circles is not None:
    # 将检测到的圆心坐标转换成整数
    circles = np.uint16(np.around(circles))
    # 循环绘制圆心 和 圆形
    for cir in circles[0, :]:
        # 解包
        x, y, r = cir
        # 绘制圆心
        cv2.circle(hough_img, (x, y), 2, (0, 255, 0), -1)
        # 绘制圆形
        cv2.circle(hough_img, (x, y), radius=r, color=(0, 255, 0), thickness=2)

img_hstack = np.hstack([img, hough_img])
cv2.imshow("img_hstack", img_hstack)
cv2.waitKey(0)